﻿using Microsoft.Office.Interop.Outlook;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace VerifyDomainOutlookAddIn.Internal
{
    /// <summary>
    /// <see cref="MailItem"/> を拡張します。
    /// </summary>
    static class MailItemExtensions
    {
        /// <summary>
        /// 送信者のドメインを取得します。
        /// </summary>
        /// <param name="mail">メールアイテム。</param>
        /// <returns></returns>
        public static string GetSenderDomain(this MailItem mail)
        {
            var senderSmtpAddress = mail.GetSenderSmtpAddress();

            var internalDomain = senderSmtpAddress.Split('@').LastOrDefault();

            if (string.IsNullOrEmpty(internalDomain))
            {
                throw new InvalidOperationException("送信者のドメインを取得できませんでした。");
            }

            return internalDomain;
        }

        /// <summary>
        /// 送信者のメールアドレスを取得します。
        /// </summary>
        /// <param name="mail">メールアイテム。</param>
        /// <returns></returns>
        static string GetSenderSmtpAddress(this _MailItem mail)
        {
            string senderSmtpAddress = null;

            var account = mail.SendUsingAccount;
            if (account != null)
            {
                senderSmtpAddress = account.SmtpAddress;
            }

            // send with single account from draft or explorer
            if (string.IsNullOrEmpty(senderSmtpAddress))
            {
                var entry = mail.Session.CurrentUser.AddressEntry;
                if (entry != null)
                {
                    senderSmtpAddress = entry.GetSmtpAddress();
                }
            }

            if (string.IsNullOrEmpty(senderSmtpAddress))
            {
                throw new InvalidOperationException("送信者のアドレスを取得できませんでした。");
            }

            return senderSmtpAddress;
        }

        /// <summary>
        /// 受信者のメールアドレスを取得します。Exchange グループのメールアドレスは含みません。
        /// </summary>
        /// <param name="mail">メールアイテム。</param>
        /// <returns></returns>
        public static IEnumerable<string> GetRecipientsSmtpAddresses(this MailItem mail)
        {
            //  グループ宛のときに ExchangeUser が null になるけど Exchange 内だから無視してもよい

            return mail.Recipients
                .Cast<Recipient>()
                .Select(x => x.AddressEntry.GetSmtpAddress())
                .Where(x => !string.IsNullOrEmpty(x));
        }

        /// <summary>
        /// 送信待機時間（分）を設定します。
        /// </summary>
        /// <param name="mail">メールアイテム。</param>
        /// <param name="sendWaitMinutes">送信待機時間（分）。</param>
        public static void SetSendWaitMinutes(this MailItem mail, int sendWaitMinutes)
        {
            if (sendWaitMinutes > 0)
            {
                mail.DeferredDeliveryTime = DateTime.Now.AddMinutes(sendWaitMinutes);
            }
        }
    }
}
